package com.divemotor.ventarepuestosinternet.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;

import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Opcion;
import com.divemotor.ventarepuestosinternet.model.Perfil;
import com.divemotor.ventarepuestosinternet.service.OpcionService;

@ManagedBean(name="menuController")
@SessionScoped
public class MenuController implements Serializable{
	
	private static final Logger logger = Logger.getLogger(MenuController.class);
	private static final long serialVersionUID = -1193007793335713182L;
	
	@ManagedProperty(value = "#{opcionService}")
	private OpcionService opcionService;
	private MenuModel modeloMenu;
	private boolean mostrarMenu;

	@PostConstruct
	void init(){
	}
	
	public void generarMenu(){
		try {
			mostrarMenu = true;
			modeloMenu = new DefaultMenuModel();
			//listar opciones padre
			List<Opcion> listaPadre = buscarOpcionesPadre();
			//iterar opciones padre
			List<Opcion> listaHijos = new ArrayList<Opcion>();
			int indice = 0;
			int indiceHijo = 0;
			while(indice<listaPadre.size()){
				//listar opciones hijo
				listaHijos =  buscarOpcionesHijo(listaPadre.get(indice));
				//si cantidad opciones hijo es mayor a 0
				if(listaHijos.size()>0){
					//agregar opcion padre al modelo (submenu)
					Submenu subMenu = new Submenu();
					subMenu.setLabel(listaPadre.get(indice).getNombre());
					indiceHijo = 0;
					//iterar opciones hijo
					while(indiceHijo<listaHijos.size()){
						//si es un hijo simple
						if(listaHijos.get(indiceHijo).getEsPadre().trim().equals("N")){
							//agregar opciones hijo al modelo (menuitem)
							MenuItem item = new MenuItem();
							
							item.setValue(listaHijos.get(indiceHijo).getNombre());
							item.setUrl(listaHijos.get(indiceHijo).getUrl());
							subMenu.getChildren().add(item); 
						}else{
							//en caso que el hijo sea un submenu
							Submenu subMenuHijo = new Submenu();
							subMenuHijo.setLabel(listaHijos.get(indiceHijo).getNombre());
							subMenuHijo = generarSubmenuHijo(subMenuHijo, listaHijos.get(indiceHijo)); 
							subMenu.getChildren().add(subMenuHijo);
						}
						indiceHijo++;
					}//fin iteracion hijo
					
					modeloMenu.addSubmenu(subMenu);
					mostrarMenu = true;
				}//fin si
				indice++;
			}//fin iteracion padre
		} catch (Exception e) {
			logger.error("EX* generarMenu: " + e.getMessage());
		}
	}
	
	//Buscar las opciones padre
	public List<Opcion> buscarOpcionesPadre() throws DivemotorBusinessException{
		return opcionService.listarOpcionesSinPadresSegunPerfil((Perfil)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("perfil"));
	}
	
	public List<Opcion> buscarOpcionesHijo(Opcion opcionPadre) throws DivemotorBusinessException{
		return opcionService.listarOpcionesHijosDeOpcionPadreSegunPerfil(opcionPadre, (Perfil)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("perfil"));
	}
	
	public Submenu generarSubmenuHijo(Submenu subMenu, Opcion opcionPadre) throws DivemotorBusinessException{
		//listar opciones hijo
		List<Opcion> listaHijos = new ArrayList<Opcion>();
		listaHijos =  buscarOpcionesHijo(opcionPadre);
		
		int indiceHijo = 0;
		//iterar opciones hijo
		while(indiceHijo<listaHijos.size()){
			//si es un hijo simple
			if(listaHijos.get(indiceHijo).getEsPadre().trim().equals("N")){
				//agregar opciones hijo al modelo (menuitem)
				MenuItem item = new MenuItem();
				item.setValue(listaHijos.get(indiceHijo).getNombre());
				item.setUrl(listaHijos.get(indiceHijo).getUrl());
				subMenu.getChildren().add(item); 
			}else{
				//en caso que el hijo sea un submenu
				Submenu subMenuHijo = new Submenu();
				subMenuHijo.setLabel(listaHijos.get(indiceHijo).getNombre());
				subMenuHijo = generarSubmenuHijo(subMenuHijo, listaHijos.get(indiceHijo)); 
				subMenu.getChildren().add(subMenuHijo);
			}
			indiceHijo++;
		}//fin iteracion hijo
		return subMenu;
	}
	
	public MenuModel getModeloMenu() {
		return modeloMenu;
	}

	public void setModeloMenu(MenuModel modeloMenu) {
		this.modeloMenu = modeloMenu;
	}

	public boolean isMostrarMenu() {
		return mostrarMenu;
	}

	public void setMostrarMenu(boolean mostrarMenu) {
		this.mostrarMenu = mostrarMenu;
	}

	public void setOpcionService(OpcionService opcionService) {
		this.opcionService = opcionService;
	}
	
}
